// 基本数据类型的相互转换 必须显示转换 不能自动转换 T(v)  
// 大转小 编译不会报错 小心溢出
// 如果没有使用到一个包 前面加_ 忽略避免编译报错
package main

import "fmt"
import _ "unsafe"
import "strconv"


func main(){

	var i int = 100
	//转换 float32
	var b = float32(i)
	var c = int8(i)
	fmt.Println("b=",b)
	fmt.Println("c=",c)


	//一、使用 fmt.Sprintf 来转换基础数据类型到字符串
	var one int = 99
	var two float32 = 0.15
	var three bool = true
	var four byte = 'h'

	str := fmt.Sprintf("%d",one)
	fmt.Printf("str type %T str=%q\n",str,str)

	str = fmt.Sprintf("%f",two)
	fmt.Printf("str type %T str=%q\n",str,str)
	
	str = fmt.Sprintf("%t",three)
	fmt.Printf("str type %T str=%q\n",str,str)
	
	str = fmt.Sprintf("%c",four)
	fmt.Printf("str type %T str=%q\n",str,str)
	
	
	//二、strconv包函数转字符串 
	//第一个要int64位 第二个参数是进制
	str = strconv.FormatInt(int64(one),10)
	fmt.Printf("str type %T str=%q\n",str,str)
	//便捷转法
	str = strconv.Itoa(55)
	fmt.Printf("str type %T str=%q\n",str,str)


	
	//第一个参数要float64位 第二个参数 常规格式输出 第三个参数小数位保留  第四个参数表示float64
	str = strconv.FormatFloat(float64(two),'f',10,64)
	fmt.Printf("str type %T str=%q\n",str,str)

	str = strconv.FormatBool(three)
	fmt.Printf("str type %T str=%q\n",str,str)

	

	//string 转基础数据类型
	var five = "0.15145"
	var six = "false"
	var seven = "15"

	//strconv.ParseBool 会返回两个值 ，第一个值是bool 第二个是error
	// 下划线表示忽略第二个返回值
	var sixStr,_ = strconv.ParseBool(six);
	fmt.Printf("sixStr type %T sixStr=%v\n",sixStr,sixStr)

	//第二个表示转换进制 第三个表示转换的int类型 int int32
	var sevenStr,_ = strconv.ParseInt(seven,10,0)
	fmt.Printf("sevenStr type %T sevenStr=%v\n",sevenStr,sevenStr)
	
	//第二个参数表示转换后的float位数32/64
	var fiveStr,_ = strconv.ParseFloat(five,64)
	fmt.Printf("fiveStr type %T fiveStr=%v\n",fiveStr,fiveStr)

	//非法数据转换不会报错 会转换成对应类型的默认值（也称为零值）
	var errorStr,_ = strconv.ParseInt("hello",10,0)
	fmt.Printf("errorStr type %T errorStr=%v\n",errorStr,errorStr)
	var errorStr2 ,_ = strconv.ParseFloat("hello",32)
	fmt.Printf("errorStr type %T errorStr=%v\n",errorStr2,errorStr2)
	 
}